/**
 * 微信工具类
 * @author hejiacheng
 * @date 2021-12-3
 */

import storageUtil from '@/utils/storageUtil.js'
import toastUtil from '@/utils/toastUtil.js'
import {
	findUserApi,
	addUserApi,
	updateUserApi
} from '@/api/userApi'

import {
	getUserConfig,
	getProvider
} from './userConfig.js'

let userUtil = {}

/**
 * 获取openid
 */
userUtil.getOpenId = function() {
	console.log('获取openId.....')
	return new Promise(function(resolve, reject) {
		// 查看缓存的openid
		let openId = storageUtil.getOpenId()
		if (openId) {
			resolve && resolve(openId)
			return
		}
		// 获取openid
		toastUtil.showLoading()
		console.log('获取对应厂商的openid.....')
		// 获取用户配置
		getUserConfig().then((config) => {

			// 登录 获取code
			uni.login({
				provider: storageUtil.getEnv(), //这里服务商名是字节跳动小程序 所以填toutiao
				success: (loginRes) => {
					console.log('loginRes : ', loginRes); //获取到当前用户的code
					if ('toutiao' == storageUtil.getEnv() || 'weixin' == storageUtil.getEnv()) {
						//请求获取openid
						uniCloud.callFunction({
								name: 'getOpenId',
								data: {
									code: loginRes.code,
									env: storageUtil.getEnv()
								}
							})
							.then((res) => {
								console.log('调用云函数成功 : res ', res)
								console.log('获取openid 成功 : ', res)
								console.log(res.result.data.openid);
								// 缓存openid
								storageUtil.setOpenId(res.result.data.openid)
								console.log('缓存的openid ： ', storageUtil
									.getOpenId())
								resolve && resolve(res.result.data.openid)
							}, (res) => {
								console.log('调用云函数失败 : res ', res)
							})
					} else if ('qq' == storageUtil.getEnv()) {
						//请求获取openid
						uni.request({
							url: 'https://api.q.qq.com/sns/jscode2session?appid=' +
								config.appid + '&secret=' + config.secret +
								'&js_code=' + loginRes.code +
								'&grant_type=authorization_code',
							data: {
								code: loginRes.code, //上面获取到的用户的code
								appid: config.appid, //小程序的AppID
								secret: config.secret //小程序的AppSecret
							},
							success: (res) => {
								console.log('获取openid 成功 : ', res)
								console.log(res.data.openid);
								// 缓存openid
								storageUtil.setOpenId(res.data.openid)
								console.log('缓存的openid ： ', storageUtil
									.getOpenId())
								resolve && resolve(res.data.openid)
							},
							fail: (res) => {
								console.log('获取openid 失败 : ', res)
								reject && reject()
							}
						});
					} else {
						//请求获取openid
						uniCloud.callFunction({
								name: 'getOpenId',
								data: {
									code: loginRes.code
								}
							})
							.then((res) => {
								console.log('调用云函数成功 : res ', res)
								console.log('获取openid 成功 : ', res)
								console.log(res.result.data.openid);
								// 缓存openid
								storageUtil.setOpenId(res.result.data.openid)
								console.log('缓存的openid ： ', storageUtil
									.getOpenId())
								resolve && resolve(res.result.data.openid)
							}, (res) => {
								console.log('调用云函数失败 : res ', res)
							})
					}

				},
				fail: function(res) {
					reject && reject(res)
					console.log("uni.login  fail.... : res : ", res)
				},
				complete: (res) => {
					console.log('uni.login complete : ', res)
				}
			});
		}, (res) => {
			reject && reject(res)
		}).finally(() => {
			toastUtil.hideLoading()
		})
	})

}

/**
 * 初始化用户
 */
userUtil.initUser = function(successCallBack) {
	console.log("initUser......")
	let userinfo = storageUtil.getUserInfo()
	if (userinfo) {
		successCallBack && successCallBack()
		return
	}

	// 获取数据库中的用户
	userUtil.getUser().then((res) => {
		console.log('查询用户信息 : ', res)
		// 不存在用户 新增用户
		if (!res) {
			// 新增用户(没有头像用户)
			addUser(successCallBack)
		} else {
			successCallBack && successCallBack()
		}
	}, (res) => {
		console.log('fail res : ', res)
		toastUtil.showToast("查找用户信息失败!")
	})

}

/**
 * 获取数据库中的用户
 */
userUtil.getUser = function(successCallBack) {
	console.log("getUser......")
	return new Promise(function(resolve, reject) {
		// 获取当前环境
		getProvider().then((env) => {
			// 获取用户openid
			userUtil.getOpenId().then((openId) => {
				let form = {
					env: env,
					openId: openId
				}
				// 查找用户
				findUserApi(form).then((res) => {
					console.log('查询用户信息 : ', res)
					// 不存在用户 初始化问题
					if (!res) {
						// 不存在用户 返回null
						resolve && resolve(null)
					} else {
						// 存在用户，缓存用户
						storageUtil.setUserInfo(res)
						resolve && resolve(res)
					}
				}, (res) => {
					console.log('fail res : ', res)
					toastUtil.showToast("查找用户信息失败!")
					reject && reject(res)
				})
			})
		})

	})
}

/**
 * 更新用户
 */
userUtil.updateUser = function(data) {
	console.log("updateUser......")
	return new Promise(function(resolve, reject) {
		userUtil.getUser().then((user) => {
			// 没有用户，先创建用户再更新
			if(!user){
				addUser(() => {
					updateUserApi(data).then((res) => {
						resolve && resolve(res)
					}, (res) => {
						reject && reject(res)
					})
				})
			}else{
				updateUserApi(data).then((res) => {
					resolve && resolve(res)
				}, (res) => {
					reject && reject(res)
				})
			}
		}, (res) => {
			reject && reject(res)
		})
	})

	return updateUserApi(data)
}

// 添加用户
function addUser(successCallBack) {
	console.log("addUser......")
	addUserApi({
		env: storageUtil.getEnv(),
		openId: storageUtil.getOpenId()
	}).then((res) => {
		console.log('添加用户信息 : ', res)
		// 重新查询一次用户信息
		userUtil.initUser()
		successCallBack && successCallBack()
	}, (res) => {
		console.log('fail res : ', res)
		toastUtil.showToast('用户信息存储失败!')
	})
}

export default userUtil
